<?php
declare (strict_types = 1);

namespace app\home\controller;

use think\facade\Cache;
use think\Request;
use think\facade\View;
use think\facade\Log;

class Notify extends Base
{
    /**
     * 同步回调地址
     */
    public function callback(){
        # 验证签名
//        require_once(public_path()."/plugins/alipay/config.php");
        require_once public_path().'/plugins/alipay/pagepay/service/AlipayTradeService.php';
        $arr=$_GET;
        $config = config('alipay');
        $alipaySevice = new \AlipayTradeService($config);
        $result = $alipaySevice->check($arr);

        /* 实际验证过程建议商户添加以下校验。
        1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
        2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
        3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
        4、验证app_id是否为该商户本身。
        */
        if($result) {//验证成功
            //商户订单号
            $out_trade_no = htmlspecialchars($_GET['out_trade_no']);
            # 判断订单是否在我们自己数据库
            $order_info = \app\common\model\Order::find($out_trade_no);
            if ($order_info) {
                #
                $user_id = session('user_info.id');
                Cache::delete($user_id.$out_trade_no);
                //支付宝交易号
                $trade_no = htmlspecialchars($_GET['trade_no']);

                return View::fetch('order/paysuccess',['pay_name' => $order_info->pay_name,'pay_price' => $order_info->order_amount]);
            } else {
                //验证失败
                return View::fetch('order/payfail');
            }


        }
        else {
            //验证失败
            return View::fetch('order/payfail');
        }

    }

    /**
     * 支付宝异步回调地址
     */
    public function syncNotify(){
//        require_once 'config.php';
//        require_once 'pagepay/service/AlipayTradeService.php';
//
//        $arr=$_POST;
//        $alipaySevice = new AlipayTradeService($config);
//
//        $alipaySevice->writeLog(var_export($_POST,true));
//        $result = $alipaySevice->check($arr);
        $result = true;

        # 记录支付日志
        Log::write(json_encode(\request()->post()));
        /* 实际验证过程建议商户添加以下校验。
        1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
        2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
        3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
        4、验证app_id是否为该商户本身。
        */
        if($result) {//验证成功
            //请在这里加上商户的业务逻辑程序代
            //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
            //商户订单号
            $out_trade_no = $_POST['out_trade_no'];

            # 判断订单是否在我们自己数据库
            $order_info = \app\common\model\Order::find($out_trade_no);
            if (!$order_info) {
                //验证失败
                echo "fail"; //告诉支付宝
                die();
            }
            //支付宝交易号
            $trade_no = $_POST['trade_no'];
            //交易状态
            $trade_status = $_POST['trade_status'];
            if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
                //判断该笔订单是否在商户网站中已经做过处理
                if ($order_info->order_status == 1) {
                    echo "success";    //请不要修改或删除
                    die();
                }
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                $order_info->order_status = 1;
                $update_result = $order_info->save();
                if ($update_result) {
                    //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
                    echo "success";	//请不要修改或删除
                } else {
                    //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
                    echo "fail";	//请不要修改或删除
                }
                //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
                //如果有做过处理，不执行商户的业务程序
                //注意：
                //付款完成后，支付宝系统发送该交易状态通知
            }
        }else {
            //验证失败
            echo "fail";

        }
    }
}
